iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0
Software Development

30天!玩轉TypeScript開發書單系統系列 第 4

 [Day04] 就泛吧!TypeScript 的泛型 - Generics:讓你少寫扣的好方法

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20230918/20124462cRndHovbid.png


約束與靈活性


泛型(Generics)這個 TypeScript 的特性就像是一束光
為我們在強型別中提供了彈性的方法

因此,了解泛型將讓我們更有感覺
同時也更有把握
在面對複雜的型別挑戰時更加游刃有餘


泛型(Generics)


使用泛型時
我們可以型別約束
且不用特地為了某型別另外再寫複用的方法

舉例以下個簡單例子
假設我們有一個任務
要跟據使用者給的參數而回傳會員資訊

TypeScript 函數 useUserCluster
它接受一個泛型參數 UserType
該參數可以是 VipMemberNormalMember 中的一種

const vipLevelStatus =  [
  'normal',
  'not vip but better than normal',
  'vip',
] as const 

type VipLevel = typeof vipLevelStatus[number];

interface VipMember {
  name: string;
  vipLevel: VipLevel;
}

interface NormalMember {
  name: string;
  email: string;
}


export const useUserCluster = <UserType extends VipMember | NormalMember>() => {

  const getUserName = (user: UserType) => {
    return user.name;
  }

  const getUserLevel = (user: UserType): VipLevel  => {
    if ('vipLevel' in user) {
      return  (user as VipMember).vipLevel;
    }
    return vipLevelStatus[0];
  }

  return {
    getUserName,
    getUserLevel
  }
}

// NormalMember
const normalUserCluster =  useUserCluster<NormalMember>();
const normalUser: NormalMember  = {
  name: 'John',
  email: '1234@gmail.com',
}
console.log(normalUserCluster.getUserName(normalUser)); // John
console.log(normalUserCluster.getUserLevel(normalUser)); // normal

// VIP
const vipCluster =  useUserCluster<VipMember>();
const vipUser: VipMember  = {
  name: 'Super Man',
  vipLevel: vipLevelStatus[2],
}
console.log(vipCluster.getUserName(vipUser)); // Super Man
console.log(vipCluster.getUserLevel(vipUser)); // vip


期待在下一篇中繼續分享更多有趣的內容^_______^


上一篇
 [Day03] 可愛吧!TypeScript 的接口 - Interface
下一篇
[Day05] 規劃吧!夢寐以求的書單系統 - 需求分析
系列文
30天!玩轉TypeScript開發書單系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言